#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 19-6-22 上午10:09
# @Author  : Tom
# @Site    : 
# @File    : increment_view.py
# @Software: PyCharm

# 主要分为接口设计，逻辑分析
# 接口：
# 请求方式：get
# 请求路径：statistical/total_count/
# 请求参数：可以携带token值
# 返回结果：
# "count": "总用户量",
# "date": "日期"


# 逻辑分析:
# 1. 获取jwt值进行验证
# 2. 从数据库获取用户数据
# 3. 返回前端数据
# 4. 看继承于视图还是视图集，最后选择apiviw

from datetime import date, timedelta

from rest_framework.generics import GenericAPIView
from rest_framework.permissions import IsAdminUser
from rest_framework.response import Response
from rest_framework.views import APIView

from goods.models import GoodsVisitCount
from meiduo_admin.serilizers import GoodsSerializer
from orders.models import OrderInfo
from users.models import User


# 获取用户总量
class IncrementCountView(APIView):
    """
    用户总量统计
    """
    # 设置该类的访问权限，jwt自动给我们检验
    permission_classes = [IsAdminUser, ]

    def get(self, request):
        # 1.验证token值

        # 2.获取总用户量
        user_count = User.objects.all().count()
        # 3. 获取当前时间
        now_date = date.today()
        # 4.返回结果数据
        return Response({
            "count": user_count,
            "date": now_date,
        })


# 获取日访问次数
class IncrementDayCountView(APIView):
    """日增用户统计"""
    # 设置该类的访问权限，jwt自动给我们检验
    permission_classes = [IsAdminUser, ]

    def get(self, request):
        # 1.验证token值
        # 2. 获取当前时间
        now_date = date.today()

        # 2.获取总用户量
        user_count = User.objects.filter(date_joined__gte=now_date).count()
        # 4.返回结果数据
        return Response({
            "count": user_count,
            "date": now_date,
        })


# 日活跃量
class IncrementDayActiveView(APIView):
    """日活跃用户"""
    # 设置该类的访问权限，jwt自动给我们检验
    permission_classes = [IsAdminUser, ]

    def get(self, request):
        # 1.验证token值
        # 2. 获取当前时间
        now_date = date.today()

        # 2.获取总用户量
        user_count = User.objects.filter(last_login__gte=now_date).count()
        # 4.返回结果数据
        return Response({
            "count": user_count,
            "date": now_date,
        })


# 日下单量:
class IncrementDayOrderView(APIView):
    """日下单量"""
    # 设置该类的访问权限，jwt自动给我们检验
    permission_classes = [IsAdminUser, ]

    def get(self, request):
        # 1.验证token值
        # 2. 获取当前时间
        now_date = date.today()

        # 2.获取总用户量：这里有一个坑：1个人先后买量单商品，因为为一个用户，所以用户量应该为1
        # order_count = User.objects.filter(orders__create_time__gte=now_date).count()
        # 方法1：
        users = User.objects.filter(orders__create_time__gte=now_date)
        print(users)
        order_count = users.distinct().count()

        # 方法2：
        # orders = OrderInfo.objects.filter(create_time__gte=now_date)
        # print(orders)
        # print(orders.values())
        # print(orders.values('user_id'))
        # order_count = orders.values("user_id").distinct().count()
        # 4.返回结果数据
        return Response({
            "count": order_count,
            "date": now_date,
        })


# 日分类商品访问量日增用户统计:从今天起开始计算一个月前的访问量
class UserMonthCountView(APIView):
    permission_classes = [IsAdminUser, ]

    def get(self, request):
        # 1. 获取当前的日期，使用当前的日期减去30天
        # 2. 然后遍历这三十天，用列表存储这三十天的用户量和日期
        now_date = date.today()
        amonth_ago_date = now_date - timedelta(days=29)
        user_count_month = []
        for i in range(30):
            start_index = amonth_ago_date + timedelta(i)
            stop_index = amonth_ago_date + timedelta(i + 1)
            user_count = User.objects.filter(date_joined__gte=start_index, date_joined__lt=stop_index).count()
            user_count_month.append({
                "count": user_count,
                "date": start_index,
            })
        return Response(user_count_month)


# 日分类商品访问总量
class GoodsDayCountView(APIView):
    permission_classes = [IsAdminUser, ]

    def get(self, request):
        # 获取当天日期
        now_date = date.today()
        # 获取当天访问的商品分类数量信息
        data = GoodsVisitCount.objects.filter(date__gte=now_date)
        # 序列化返回分类数量
        ser = GoodsSerializer(data, many=True)
        return Response(ser.data)
